The notebook is more of a visualization workshop using polling data as working examples. It is NOT meant to provide any in-depth political insights.


Prerequisites

Platform

The source data contains traditional Chinese characters encoded in UTF-8. To avoid troublesome encoding issues (especially in a Windows platform with a default CP1252 code page), the codes in this notebook are only tested on Ubuntu and macOS. Codes are in general still working under Windows. Just that some code chunks may not be able to print out unicode characters nicely.

Data

Election Data

We use minimally pre-processed data for our analytics. Please refer to the repo TW_Presidential_Election_2020 for details about the pre-processing logic. To directly download the archives please visit here. We put the uncompressed files under data/processed at our project root directory.

Map Data

For Taiwan map information, the shp file (shapefile) can be downloaded at GADM.org. We put the unzipped files under data/map at our project root directory.

Dependencies

Additional dependencies are required for Linux machine in order to do map plotting. Here is the instruction for Ubuntu.

Install gdal:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt update
sudo apt install libgdal-dev

Install ubunits:

sudo apt install libudunits2-dev

After installation of the above packages, we can then install and import the following R packages for this project:

library(data.table)

# For viualization.
library(ggplot2)
library(ggrepel)
library(plotly)

# Fix macOS ggplot device to locate a Chinese font.
# To make `knitr` aware of this we also need to speficy `fig.showtext=TRUE` for chunks with ggplot output.
library(showtext)
font_add_google("Noto Serif", "noto")
showtext_auto()

# For spatial data visualization.
library(sf)

# For linear modeling with robust std err.
library(lmtest)
library(sandwich)

References on R Packages

Berger, Susanne, Nathaniel Graham, and Achim Zeileis. 2017. “Various Versatile Variances: An Object-Oriented Implementation of Clustered Covariances in R.” Working Paper 2017-12. Working Papers in Economics; Statistics, Research Platform Empirical; Experimental Economics, Universität Innsbruck. http://EconPapers.RePEc.org/RePEc:inn:wpaper:2017-12.

Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.

Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.

Qiu, Yixuan, and authors/contributors of the included software. See file AUTHORS for details. 2019. Showtext: Using Fonts More Easily in R Graphs. https://CRAN.R-project.org/package=showtext.

Sievert, Carson. 2018. Plotly for R. https://plotly-r.com.

Slowikowski, Kamil. 2019. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Gplot2’. https://CRAN.R-project.org/package=ggrepel.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

Zeileis, Achim, and Torsten Hothorn. 2002. “Diagnostic Checking in Regression Relationships.” R News 2 (3): 7–10. https://CRAN.R-project.org/doc/Rnews/.

LS0tCnRpdGxlOiAiVmlzdWFsaXphdGlvbiBmb3IgVFcgR2VuZXJhbCBFbGVjdGlvbiIKc3VidGl0bGU6ICIyMDIwIFByZXNpZGVudGlhbCBhbmQgTGVnaXNsYXRpdmUgUmVzdWx0cyIKYXV0aG9yOgotIG5hbWU6IEt5bGUgQ2h1bmcKICBhZmZpbGlhdGlvbjoKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJWIgJVknKWAgTGFzdCBVcGRhdGVkICgxOSBKYW4gMjAyMCBGaXJzdCBVcGxvYWRlZCkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfd2lkdGg6IDguMzMKICAgIGZpZ19oZWlnaHQ6IDYuMjUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IC90bXAvbWV0YV9oZWFkZXIuaHRtbAogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogdHdfZWxlY3Rpb25fMjAyMC5iaWIKbm9jaXRlOiB8CiAgQGRhdGEudGFibGUKICBAZ2dwbG90MgogIEBnZ3JlcGVsCiAgQHBsb3RseQogIEBzaG93dGV4dAogIEBzZgogIEBsbXRlc3QKICBAc2FuZHdpY2gKbGluay1jaXRhdGlvbnM6IHllcwphYnN0cmFjdDogfAogIFRoZSBub3RlYm9vayBwcm92aWRlcyBhIG5lYXJseS1uZXV0cmFsIHZpc3VhbCBkZXNjcmlwdGlvbiBvbiB0aGUgMjAyMCBUYWl3YW5lc2UgcHJlc2lkZW50aWFsIGFuZCBsZWdpc2xhdGl2ZSBlbGVjdGlvbiByZXN1bHRzLiBUaGUgcG9sbGluZyB0b29rIHBsYWNlIGF0IDIwMjAtMDEtMTEgYW5kIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkIGJ5IENlbnRyYWwgRWxlY3Rpb24gQ29tbWlzaW9uIChDRUMpIGF0IHRoZSBwb2xsaW5nIHBsYWNlIGxldmVsLgotLS0KCmBgYHtyIG1ldGEsIGluY2x1ZGU9RkFMU0V9Cm1ldGFfaGVhZGVyX2ZpbGUgPC0gZmlsZSgiL3RtcC9tZXRhX2hlYWRlci5odG1sIikKCiMgQWRkIG9wZW4gZ3JhcGggbWV0YS4KbWV0YSA8LSBjKAogICc8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ikt5bGUgQ2h1bmciPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzp0aXRsZSIgY29udGVudD0iMjAyMCBUYWl3YW5lc2UgUHJlc2lkZW50aWFsIEVsZWN0aW9uIERhdGEiPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzp0eXBlIiBjb250ZW50PSJhcnRpY2xlIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dXJsIiBjb250ZW50PSJodHRwczovL2V2ZXJkYXJrLmdpdGh1Yi5pby9rOS9wcm9qZWN0cy90d19lbGVjdGlvbl8yMDIwL3R3X2VsZWN0aW9uXzIwMjAubmIuaHRtbCI+JywKICAnPG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL2V2ZXJkYXJrLmdpdGh1Yi5pby9rOS9hc3NldHMvdHdfZWxlY3Rpb25fMjAyMC5wbmciPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkYXRhIHNjaWVuY2Ugbm90ZWJvb2sgYWJvdXQgMjAyMCBUYWl3YW5lc2UgcHJlc2lkZW50aWFsIGVsZWN0aW9uLiI+JwopCmNvbnRlbnRzIDwtIG1ldGEKCiMgQWRkIEdpdGh1YiBjb3JuZXIuCmdpdGh1Yl9jb3JuZXJfc3ZnIDwtICIuLi8uLi9hc3NldHMvZ2l0aHViX2Nvcm5lci5odG1sIgpnaXRodWJfY29ybmVyX2NvbmYgPC0gbGlzdChnaXRodWJfbGluaz0iaHR0cHM6Ly9naXRodWIuY29tL2V2ZXJkYXJrL2s5L3RyZWUvbWFzdGVyL3Byb2plY3RzL3R3X2VsZWN0aW9uXzIwMjAiKQpjb250ZW50cyA8LSBjKGNvbnRlbnRzLCBzdHJpbmdyOjpzdHJfaW50ZXJwKHJlYWRMaW5lcyhnaXRodWJfY29ybmVyX3N2ZyksIGdpdGh1Yl9jb3JuZXJfY29uZikpCndyaXRlTGluZXMoY29udGVudHMsIG1ldGFfaGVhZGVyX2ZpbGUpCgpjbG9zZShtZXRhX2hlYWRlcl9maWxlKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLmFsaWduPSJjZW50ZXIiKQpgYGAKCi0tLQoKKlRoZSBub3RlYm9vayBpcyBtb3JlIG9mIGEgdmlzdWFsaXphdGlvbiB3b3Jrc2hvcCB1c2luZyBwb2xsaW5nIGRhdGEgYXMgd29ya2luZyBleGFtcGxlcy4qCipJdCBpcyBOT1QgbWVhbnQgdG8gcHJvdmlkZSBhbnkgaW4tZGVwdGggcG9saXRpY2FsIGluc2lnaHRzLioKCi0tLQoKIyBQcmVyZXF1aXNpdGVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMgUGxhdGZvcm0KClRoZSBzb3VyY2UgZGF0YSBjb250YWlucyB0cmFkaXRpb25hbCBDaGluZXNlIGNoYXJhY3RlcnMgZW5jb2RlZCBpbiBVVEYtOC4KVG8gYXZvaWQgdHJvdWJsZXNvbWUgZW5jb2RpbmcgaXNzdWVzIChlc3BlY2lhbGx5IGluIGEgV2luZG93cyBwbGF0Zm9ybSB3aXRoIGEgZGVmYXVsdCBgQ1AxMjUyYCBjb2RlIHBhZ2UpLAp0aGUgKipjb2RlcyBpbiB0aGlzIG5vdGVib29rIGFyZSBvbmx5IHRlc3RlZCBvbiBVYnVudHUgYW5kIG1hY09TLioqCkNvZGVzIGFyZSBpbiBnZW5lcmFsIHN0aWxsIHdvcmtpbmcgdW5kZXIgV2luZG93cy4KSnVzdCB0aGF0IHNvbWUgY29kZSBjaHVua3MgbWF5IG5vdCBiZSBhYmxlIHRvIHByaW50IG91dCB1bmljb2RlIGNoYXJhY3RlcnMgbmljZWx5LgoKIyMgRGF0YQoKIyMjIEVsZWN0aW9uIERhdGEgey19CgpXZSB1c2UgbWluaW1hbGx5IHByZS1wcm9jZXNzZWQgZGF0YSBmb3Igb3VyIGFuYWx5dGljcy4KUGxlYXNlIHJlZmVyIHRvIHRoZSByZXBvIFtUV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMF0oaHR0cHM6Ly9naXRodWIuY29tL2V2ZXJkYXJrL1RXX1ByZXNpZGVudGlhbF9FbGVjdGlvbl8yMDIwKSBmb3IgZGV0YWlscyBhYm91dCB0aGUgcHJlLXByb2Nlc3NpbmcgbG9naWMuClRvIGRpcmVjdGx5IGRvd25sb2FkIHRoZSBhcmNoaXZlcyBwbGVhc2UgdmlzaXQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9UV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMC9yZWxlYXNlcy9sYXRlc3QpLgpXZSBwdXQgdGhlIHVuY29tcHJlc3NlZCBmaWxlcyB1bmRlciBgZGF0YS9wcm9jZXNzZWRgIGF0IG91ciBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgoKIyMjIE1hcCBEYXRhIHstfQoKRm9yIFRhaXdhbiBtYXAgaW5mb3JtYXRpb24sCnRoZSBgc2hwYCBmaWxlIChbc2hhcGVmaWxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGFwZWZpbGUpKSBjYW4gYmUgZG93bmxvYWRlZCBhdCBbR0FETS5vcmddKGh0dHBzOi8vZ2FkbS5vcmcvZG93bmxvYWRfY291bnRyeV92My5odG1sKS4KV2UgcHV0IHRoZSB1bnppcHBlZCBmaWxlcyB1bmRlciBgZGF0YS9tYXBgIGF0IG91ciBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgoKIyMgRGVwZW5kZW5jaWVzCgpBZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBhcmUgcmVxdWlyZWQgZm9yIExpbnV4IG1hY2hpbmUgaW4gb3JkZXIgdG8gZG8gbWFwIHBsb3R0aW5nLgpIZXJlIGlzIHRoZSBpbnN0cnVjdGlvbiBmb3IgVWJ1bnR1LgoKSW5zdGFsbCBbYGdkYWxgXShodHRwczovL2dkYWwub3JnLyk6CgpgYGBzaApzdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6dWJ1bnR1Z2lzL3VidW50dWdpcy11bnN0YWJsZQpzdWRvIGFwdCB1cGRhdGUKc3VkbyBhcHQgaW5zdGFsbCBsaWJnZGFsLWRldgpgYGAKCkluc3RhbGwgYHVidW5pdHNgOgoKYGBgc2gKc3VkbyBhcHQgaW5zdGFsbCBsaWJ1ZHVuaXRzMi1kZXYKYGBgCgpBZnRlciBpbnN0YWxsYXRpb24gb2YgdGhlIGFib3ZlIHBhY2thZ2VzLAp3ZSBjYW4gdGhlbiBpbnN0YWxsIGFuZCBpbXBvcnQgdGhlIGZvbGxvd2luZyBSIHBhY2thZ2VzIGZvciB0aGlzIHByb2plY3Q6CgpgYGB7ciBpbXBvcnQsIHJlc3VsdHM9ImhpZGUiLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjbGFzcy5zb3VyY2U9ImZvbGQtc2hvdyJ9CmxpYnJhcnkoZGF0YS50YWJsZSkKCiMgRm9yIHZpdWFsaXphdGlvbi4KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkocGxvdGx5KQoKIyBGaXggbWFjT1MgZ2dwbG90IGRldmljZSB0byBsb2NhdGUgYSBDaGluZXNlIGZvbnQuCiMgVG8gbWFrZSBga25pdHJgIGF3YXJlIG9mIHRoaXMgd2UgYWxzbyBuZWVkIHRvIHNwZWZpY3kgYGZpZy5zaG93dGV4dD1UUlVFYCBmb3IgY2h1bmtzIHdpdGggZ2dwbG90IG91dHB1dC4KbGlicmFyeShzaG93dGV4dCkKZm9udF9hZGRfZ29vZ2xlKCJOb3RvIFNlcmlmIiwgIm5vdG8iKQpzaG93dGV4dF9hdXRvKCkKCiMgRm9yIHNwYXRpYWwgZGF0YSB2aXN1YWxpemF0aW9uLgpsaWJyYXJ5KHNmKQoKIyBGb3IgbGluZWFyIG1vZGVsaW5nIHdpdGggcm9idXN0IHN0ZCBlcnIuCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpgYGAKCiMgQmFja2dyb3VuZAoKKyBbMjAyMCAxNXRoIFRhaXdhbmVzZSBQcmVzaWRlbnRpYWwgRWxlY3Rpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzIwMjBfVGFpd2FuZXNlX3ByZXNpZGVudGlhbF9lbGVjdGlvbikKKyBbMjAyMCAxMHRoIFRhaXdhbmVzZSBMZWdpc2xhdGl2ZSBFbGVjdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvMjAyMF9UYWl3YW5lc2VfbGVnaXNsYXRpdmVfZWxlY3Rpb24pCgojIFZpc3VhbCBBbmFseXRpY3Mgb24gRWxlY3Rpb24gUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxscyAjaGVhZH0KCiMjIOesrOWNgeS6lOWxhue4vee1semBuOiIiee1kOaenCBUaGUgMTV0aCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyDmnInmlYjnpaggVmFsaWQgVm90ZSBDb3VudHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCmBgYHtyIHBhcnNlX3R3X2NvdW50eV9tYXB9CiMgUmVhZCBzaGFwZWZpbGUgZm9yIHNwYXRpYWwgaW5mb3JtYXRpb24gYWJvdXQgY291bnRpZXMgaW4gVGFpd2FuLgp0d19jb3VudHlfc2YgPC0gc2Y6OnN0X3JlYWQoImRhdGEvbWFwL2dhZG0zNl9UV05fMi5zaHAiLCBxdWlldD1UUlVFKQoKIyBBbGlnbiBjb3VudHkgbmFtaW5nLgp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIuWPsOS4rSIsICLlj7DkuK3luIIiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIuWPsOWNlyIsICLlj7DljZfluIIiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIummrOelluWIl+WztiIsICLpgKPmsZ/nuKMiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQpgYGAKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgcHJvY2VzcyBjb3VudHktbGV2ZWwgcHJlc2lkZW50aWFsIGVsZWN0aW9uIHJlc3VsdHMuCnBfY291bnR5IDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9wcmVzaWRlbnRpYWwvcHJlc2lkZW50aWFsX2NvdW50aWVzLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfY291bnR5IDwtIHBfY291bnR5WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnBfY291bnR5IDwtIHBfY291bnR5WywgUmVnaW9uOj1nc3ViKCLoh7oiLCAi5Y+wIiwgUmVnaW9uKV0gICMgQWxpZ24gY2hhcmFjdGVyIHdpdGggc2hhcGVmaWxlLgpzZXRuYW1lcyhwX2NvdW50eSwgIuaKleelqOeOh0ggSD1Dw7dHIiwgIlR1cm5vdXQiKQoKIyBGaW5hbCBjb3VudHMuCmNvbHNfY2FuZGlkYXRlIDwtIGMoIigxKSDlrovmpZrnkZwg5L2Z5rmYIiwgIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IiwgIigzKSDolKHoi7Hmlocg6LO05riF5b63IikKcF9maW5hbCA8LSBhcy5kYXRhLnRhYmxlKGNvbFN1bXMocF9jb3VudHlbLCBjb2xzX2NhbmRpZGF0ZSwgd2l0aD1GQUxTRV0pLCBrZWVwLnJvd25hbWVzPVRSVUUpCnNldG5hbWVzKHBfZmluYWwsIGMoIkNhbmRpZGF0ZSIsICJWb3RlcyIpKQpwX2ZpbmFsIDwtIHBfZmluYWxbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQoKIyBNZXJnZSB3aXRoIHNocCB0byBnZXQgRW5nbGlzaCBjb3VudHkgbmFtZS4KcF9jb3VudHkgPC0gbWVyZ2UocF9jb3VudHksIHR3X2NvdW50eV9zZlssIGMoIk5MX05BTUVfMiIsICJOQU1FXzIiKV0sCiAgICAgICAgICAgICAgICAgIGJ5Lnk9Ik5MX05BTUVfMiIsIGJ5Lng9IlJlZ2lvbiIpCnBfY291bnR5JGdlb21ldHJ5IDwtTlVMTApzZXRuYW1lcyhwX2NvdW50eSwgIk5BTUVfMiIsICJSZWdpb25FbiIpCnBfY291bnR5IDwtIHBfY291bnR5WywgQ291bnR5Oj1wYXN0ZShSZWdpb24sIFJlZ2lvbkVuKV0KCiMgTWVsdCBmcm9tIHdpZGUgdG8gbG9uZyBmb3IgcGxvdHRpbmcgcHVycG9zZS4KY29sc19yZWdpb24gPC0gYygiQ291bnR5IiwgIlJlZ2lvbiIsICJSZWdpb25FbiIpCnBfY291bnR5X2wgPC0gbWVsdChwX2NvdW50eVssIGMoY29sc19yZWdpb24sIGNvbHNfY2FuZGlkYXRlKSwgd2l0aD1GQUxTRV0sCiAgICAgICAgICAgICAgICAgICBpZC52YXJzPWNvbHNfcmVnaW9uLCB2YXJpYWJsZS5uYW1lPSJDYW5kaWRhdGUiLCB2YWx1ZS5uYW1lPSJWb3RlcyIpCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIENhbmRpZGF0ZTo9ZmFjdG9yKENhbmRpZGF0ZSldICAjIExldmVsIGJ5IGNhbmRpZGF0ZSBudW1iZXIuCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IGNvdW50eS4Kc2V0b3JkZXIocF9jb3VudHlfbCwgQ291bnR5LCBDYW5kaWRhdGUpCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFZvdGVzX0RpZmY6PVZvdGVzWzNdIC0gVm90ZXNbMl0sIGJ5PS4oQ291bnR5KV0KCiMgQ29tcHV0ZSB0b3RhbCB2b3RlcyBieSBjb3VudHkuCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFRvdGFsX1ZvdGVzOj1zdW0oVm90ZXMpLCBieT0uKENvdW50eSldCgojIENvbXB1dGUgc2hhcmUgYnkgY291bnR5LgpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBUb3RhbF9Wb3Rlc10KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgU2hhcmVfRGlmZjo9Vm90ZXNfU2hhcmVbM10gLSBWb3Rlc19TaGFyZVsyXSwgYnk9LihDb3VudHkpXQpwX2NvdW50eV9kaWZmIDwtIHVuaXF1ZShwX2NvdW50eV9sLCBieT0iQ291bnR5IilbCiAgLCBjKGNvbHNfcmVnaW9uLCAiVG90YWxfVm90ZXMiLCAiU2hhcmVfRGlmZiIpLCB3aXRoPUZBTFNFXQpwX2NvdW50eV9kaWZmIDwtIHBfY291bnR5X2RpZmZbLCBkcHBfd2luOj1TaGFyZV9EaWZmID4gMF0KCiMgSm9pbiBzaGFyZSBkaWZmIHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eV9kaWZmLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQoKIyBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBEUFAgYW5kIEtNVCBvbiB0aGUgd2lkZSBkYXRhIGFzIHdlbGwuCnBfY291bnR5IDwtIHBfY291bnR5WywgVm90ZV9EaWZmOj1nZXQoIigzKSDolKHoi7Hmlocg6LO05riF5b63IikgLSBnZXQoIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IildCnBfY291bnR5IDwtIHBfY291bnR5WywgU2hhcmVfRGlmZjo9Vm90ZV9EaWZmIC8gZ2V0KCLmnInmlYjnpajmlbhBIEE9MSsyKy4uLitOIildCgojIENvbG9yIGNvbmZpZ3VyYXRpb24gZm9yIG1haW4gcGFydGllcy4KbWFpbl9wYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIiwgImdyZWVuMyIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2ZpbmFsX3Jlc3VsdCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9NCwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gRmluYWwgT3V0Y29tZSJ9CmdncGxvdChwX2ZpbmFsLCBhZXMoeD1DYW5kaWRhdGUsIHk9Vm90ZXMsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5YCZ6YG45Lq6IiwgeT0i5b6X56Wo5pW4IiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG457WQ5p6cIikgKwogIGdlb21fdGV4dChhZXMoeD1DYW5kaWRhdGUsIHk9Vm90ZXMgLyAyLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXNcbiglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlKSkpLAogICAgICAgICAgICBzaXplPTUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKVGhlIHByZS1wcm9jZXNzZWQgY291bnR5IHJlc3VsdCBmb3IgcHJlc2lkZW50aWFsIGVsZWN0aW9uIGlzIGEgKndpZGUqIGZvcm1hdCBieSBjb3VudHk6CgpgYGB7ciBzaG93X3ByZXNpZGVudGlhbF9jb3VudHlfcmVzdWx0fQpoZWFkKHBfY291bnR5WywgLWMoMTozKV0pCmBgYAoKQW5kIHdlJ3ZlIHJlc2hhcGVkIGl0IGludG8gYSAqbG9uZyogZm9ybWF0IGZvciBlYXNlIG9mIHBsb3R0aW5nOgoKYGBge3Igc2hvd19wcmVzaWRlbnRpYWxfdGFpZXBpfQojIFNob3cgcmVzdWx0IGZvciBUYWlwZWkuCnBfY291bnR5X2xbUmVnaW9uID09ICLlj7DljJfluIIiXQpgYGAKClBsb3Qgdm90ZSBjb3VudHMgYnkgY291bnR5OgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXIsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGUgQ291bnRzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5X2wsIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBUb3RhbF9Wb3RlcyksIHk9Vm90ZXMsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIiwgd2lkdGg9LjgpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLlgJnpgbjkuroiLCB2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+nee4veelqOaVuOaOkuW6j++8iSIsIHk9IuW+l+elqOaVuCIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWAmemBuOS6uuWQhOe4o+W4gu+8muW+l+elqOaVuCIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpBbmQgYWxzbyB2b3RlIHNoYXJlcyAodm90ZSBjb3VudHMgLyB0b3RhbCB2YWxpZCB2b3Rlcyk6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X2Jhcl9wY3QsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5X2wsIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBUb3RhbF9Wb3RlcyksIHk9Vm90ZXNfU2hhcmUsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249InN0YWNrIiwgd2lkdGg9LjgpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChWb3Rlc19TaGFyZSkpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9MikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWU9IuWAmemBuOS6uiIsIHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45YCZ6YG45Lq65ZCE57ij5biC77ya5b6X56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKClNpbmNlIHRoZSBtYWluIHBhcnRpZXMgYXJlIEREUCBhbmQgS01ULAp3ZSBkZWZpbmUgdm90ZSBzaGFyZSBkaWZmZXJlbmNlIGFzIHZvdGUgc2hhcmUgb2YgRERQIG1pbnVzIHRoYXQgb2YgS01ULgpUaGUgZm9sbG93aW5nIGJhcnBsb3QgZ2l2ZXMgdXMgYSBjbGVhciB2aWV3IG9mIHdoaWNoIGNvdW50eSBEUFAgd29uIHRoZSBtb3N0LgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXJfcGN0X2RpZmYsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGUgU2hhcmUgRGlmZmVyZW5jZSAoRFBQJ3MgLSBLTVQncykgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHlfZGlmZiwgYWVzKHg9cmVvcmRlcihDb3VudHksIFNoYXJlX0RpZmYpLCBmaWxsPWRwcF93aW4sIHk9U2hhcmVfRGlmZikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBjb2xvcj0iYmxhY2siLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJkb2RnZXJibHVlIiwgImdyZWVuMyIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlX0RpZmYpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIuNSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d5b6X56Wo546H5beu5o6S5bqP77yJIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya57ag6JeN5b6X56Wo546H5beuIikgKwogIGNvb3JkX2ZsaXAoKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCldlIGNhbiBhbHNvIHZpc3VhbGl6ZSB0aGUgYWJvdmUgcmFua2luZyB3aXRoIGEgY2hvcm9wbGV0aCBtYXA6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X21hcCwgZmlnLmNhcD0iQ2hvcm9wbGV0aCBNYXAgZm9yIFZvdGUgU2hhcmUgRGlmZmVyZW5jZXMgKERQUCdzIC0gS01UJ3MpIn0KcCA8LSBnZ3Bsb3QodHdfY291bnR5X3NmLCBhZXModGV4dD1Db3VudHkpKSArCiAgZ2VvbV9zZihhZXMoZmlsbD1TaGFyZV9EaWZmKSkgKwogIGNvb3JkX3NmKHhsaW09YygxMTgsIDEyMi41KSwgeWxpbT1jKDIxLjUsIDI2LjUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lPSLntqDol43lvpfnpajnjoflt64iLCBsb3c9ImJsdWUzIiwgaGlnaD0iZ3JlZW4zIikgKwogIGxhYnModGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCkFwcGFyZW50bHkgRFBQIHdvbiBtb3N0IGNvdW50aWVzIGJlc2lkZXMgbWFpbnRhaW4gYW5kIG91dGx5aW5nIGlzbGFuZCBhcmVhcy4KCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUmVhZCBjb3VudHkgc3VicmVnaW9uLWxldmVsIHByZXNpZGVudGlhbCBlbGVjdGlvbiByZXN1bHRzLgpwX3JlZ2lvbiA8LSBmcmVhZCgiZGF0YS9wcm9jZXNzZWQvcHJlc2lkZW50aWFsL3ByZXNpZGVudGlhbF9yZWdpb25zLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfcmVnaW9uIDwtIHBfcmVnaW9uWywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnNldG5hbWVzKHBfcmVnaW9uLCAi5oqV56Wo546HSCBIPUPDt0ciLCAiVHVybm91dCIpCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IHJlZ2lvbi4KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBWb3RlX0RpZmY6PWdldCgiKDMpIOiUoeiLseaWhyDos7TmuIXlvrciKSAtIGdldCgiKDIpIOmfk+Wci+eRnCDlvLXlloTmlL8iKV0KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBTaGFyZV9EaWZmOj1Wb3RlX0RpZmYgLyBnZXQoIuacieaViOelqOaVuEEgQT0xKzIrLi4uK04iKV0KCiMgV2lkZSB0byBsb25nLgpwX3JlZ2lvbl9sIDwtIG1lbHQocF9yZWdpb25bLCBjKCJCeSIsICJSZWdpb24iLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCJCeSIsICJSZWdpb24iKSwgdmFyaWFibGUubmFtZT0iQ2FuZGlkYXRlIiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBDYW5kaWRhdGU6PWZhY3RvcihDYW5kaWRhdGUpXSAgIyBMZXZlbCBieSBjYW5kaWRhdGUgbnVtYmVyLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbcF9yZWdpb24sIFNoYXJlX0RpZmY6PWkuU2hhcmVfRGlmZiwgb249LihSZWdpb24pXQoKc2V0b3JkZXIocF9yZWdpb24sIC1TaGFyZV9EaWZmKQoKIyBHcm91cCBjb3VudGllcyBpbnRvIGFyZWFzLgpub3J0aF9jb3VudGllcyA8LSBjKCLoh7rljJfluIIiLCAi5paw5YyX5biCIiwgIuWfuumahuW4giIsICLmlrDnq7nluIIiLCAi5qGD5ZyS5biCIiwgIuaWsOeruee4oyIsICLlrpzomK3nuKMiKQpjZW50cmFsX2NvdW50aWVzIDwtIGMoIuiHuuS4reW4giIsICLoi5fmoJfnuKMiLCAi5b2w5YyW57ijIiwgIuWNl+aKlee4oyIsICLpm7LmnpfnuKMiKQpzb3V0aF9jb3VudGllcyA8LSBjKCLpq5jpm4TluIIiLCAi6Ie65Y2X5biCIiwgIuWYiee+qeW4giIsICLlmInnvqnnuKMiLCAi5bGP5p2x57ijIiwgIua+jua5lue4oyIpCmVhc3RfY291bnRpZXMgPC0gYygi6Iqx6JOu57ijIiwgIuiHuuadsee4oyIpCmlzbGFuZF9jb3VudGllcyA8LSBjKCLph5HploDnuKMiLCAi6YCj5rGf57ijIikKCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzaGFyZSBkaWZmZXJlbmNlIGJhciBwbG90LgpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmIDwtIGZ1bmN0aW9uKGNvdW50aWVzLCB0aXRsZSkgewogIERUIDwtIHBfcmVnaW9uW0J5ICVpbiUgY291bnRpZXNdCiAgRFRbLCBCeTo9ZmFjdG9yKEJ5LCBsZXZlbHM9Y291bnRpZXMpXSAgIyBGaXggb3JkZXIgZm9yIGZhY2V0IGdyaWRzLgogIERUWywgUmVnaW9uMjo9cGFzdGUoQnksIFJlZ2lvbildICAjIEZpeGVkIG9yZGVyIHdpdGhpbiBmYWNldCAoc2FtZS1uYW1lIHJlZ2lvbiBmb3IgZGlmZmVyZW50IGNvdW50aWVzKS4KICBEVFssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQogIHAgPC0gZ2dwbG90KERULCBhZXMoeD1yZW9yZGVyKFJlZ2lvbjIsIFNoYXJlX0RpZmYpLCB5PVNoYXJlX0RpZmYsIGZpbGw9ZHBwX3dpbikpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZG9kZ2VyYmx1ZSIsICJncmVlbjMiKSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgICBsYWJzKHg9IiIsIHk9IiIsIHRpdGxlPXRpdGxlKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgZmFjZXRfZ3JpZChCeSB+IC4sIHNjYWxlcz0iZnJlZV95Iiwgc3BhY2U9ImZyZWVfeSIpCiAgcAp9CmBgYAoKVm90ZSBzaGFyZSBkaWZmZXJlbmNlIChEUFAgdi5zLiBLTVQpIHJhbmtlZCBieSByZWdpb24gYWNyb3NzIHRoZSBuYXRpb246CgpgYGB7ciBzaGFyZV9kaWZmX3JhbmtfYnlfcmVnaW9ufQpwX3JlZ2lvbl9yYW5rIDwtIHBfcmVnaW9uWywgLihCeSwgUmVnaW9uLCBTaGFyZV9EaWZmLCBWb3RlX0RpZmYpXQpwX3JlZ2lvbl9yYW5rIDwtIHBfcmVnaW9uX3JhbmtbLCBTaGFyZV9EaWZmOj1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZiwgLjAwMSldCnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25fcmFua1ssIGk6PS5JXQpzZXRjb2xvcmRlcihwX3JlZ2lvbl9yYW5rLCAiaSIpCnNldG5hbWVzKHBfcmVnaW9uX3JhbmssIGMoIuaOkuW6jyIsICLnuKPluIIiLCAi6YSJ6Y6u5biC5Y2AIiwgIue2oOiXjeW+l+elqOeOh+W3riIsICLntqDol43lvpfnpajmlbjlt64iKSkKcF9yZWdpb25fcmFua1tdCmBgYAoKV2UgYmFyLXBsb3QgdGhlIGFib3ZlIHJhbmtpbmcgYnkgcmVnaW9uIGJ5IGNvdW50eToKCiMjIyMjIE5vcnRoIFRhaXdhbiDljJflj7DngaMKCmBgYHtyIHByZXNpZGVudGlhbF9ub3J0aF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0xNywgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgbm9ydGhfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjljJfpg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIENlbnRyYWwgVGFpd2FuIOS4reWPsOeBowoKYGBge3IgcHJlc2lkZW50aWFsX2NlbnRyYWxfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD04fQpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmKAogIGNlbnRyYWxfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjkuK3pg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIFNvdXRoIFRhaXdhbiDljZfoh7rngaMKCmBgYHtyIHByZXNpZGVudGlhbF9zb3V0aF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0yMiwgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgc291dGhfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjljZfpg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIEVhc3QgVGFpd2FuIOadseWPsOeBowoKYGBge3IgcHJlc2lkZW50aWFsX2Vhc3RfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgZWFzdF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOadsemDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgT3V0bHlpbmcgSXNsYW5kcyDpm6Lls7YKCmBgYHtyIHByZXNpZGVudGlhbF9pc2xhbmRfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgaXNsYW5kX2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG46Zui5bO25Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMg54Sh5pWI56WoIEludmFsaWQgVm90ZSBDb3VudHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpbSW52YWxpZCB2b3Rlc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BvaWx0X3ZvdGUpIGFyZSB2b3RlcyBjYXN0IGJ1dCBkZWNsYXJlZCBpbnZhbGlkLgpUaGVyZSBpcyBubyB3YXkgdG8gb2JqZWN0aXZlbHkgcmVjb3JkIHRoZSBpbnRlbnRpb24gb2YgYW4gaW52YWxpZCB2b3RlLApoZXJlIHdlIHNpbXBseSBzdGF0aXN0aWNhbGx5IGRlc2NyaWJlIHRoZSBzaGFyZSBvZiBpbnZhbGlkIHZvdGVzIGZyb20gdG90YWwgdm90ZXMgY2FzdC4KCiMjIyMgQnkgQ291bnR5IOS+nee4o+W4ggoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfaW52YWxpZF92b3Rlc19jb3VudHksIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgaW52YWxpZCB2b3RlcyBieSBjb3VudHkuCnBfY291bnR5IDwtIHBfY291bnR5WywgSW52YWxpZF9Wb3Rlc19TaGFyZTo9Z2V0KCLnhKHmlYjnpajmlbhCIikgLyBnZXQoIuaKleelqOaVuEMgQz1BK0IiKV0KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUDo9SW52YWxpZF9Wb3Rlc19TaGFyZSAqIDEwMF0KCiMgSm9pbiBpbnZhbGlkIHZvdGUgc2hhcmVzIHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eVssIC4oUmVnaW9uLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUCldLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3BjdF9pbnZhbGlkLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5LCBhZXMoeD1yZW9yZGVyKENvdW50eSwgSW52YWxpZF9Wb3Rlc19TaGFyZSksIHk9SW52YWxpZF9Wb3Rlc19TaGFyZVApKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoSW52YWxpZF9Wb3Rlc19TaGFyZSkpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lu6LnpajnjofmjpLluo/vvIkiLCB5PSLlu6LnpajnjofvvIUiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrlu6LnpajnjociKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKVG8gc2VlIHRoZSBnZW9sb2NhdGlvbmFsIGRpZmZlcmVuY2VzOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9tYXBfaW52YWxpZCwgZmlnLmNhcD0iQ2hvcm9wbGV0aCBNYXAgZm9yIEludmFsaWQgVm90ZSBTaGFyZXMifQpwIDwtIGdncGxvdCh0d19jb3VudHlfc2YsIGFlcyh0ZXh0PUNvdW50eSkpICsKICBnZW9tX3NmKGFlcyhmaWxsPUludmFsaWRfVm90ZXNfU2hhcmVQKSkgKwogIGNvb3JkX3NmKHhsaW09YygxMTgsIDEyMi41KSwgeWxpbT1jKDIxLjUsIDI2LjUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lPSLlu6LnpajnjofvvIUiLCBsb3c9IndoaXRlIiwgaGlnaD0iYmxhY2siKSArCiAgbGFicyh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOh++8hSIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGNvcnJlbGF0aW9uIGJldHdlZW4gaW52YWxpZCB2b3RlcyBhbmQgdGhlIERQUC1LTVQgZGlmZmVyZW5jZXM6CgpgYGB7ciBwcmVzaWRlbnRpYWxfaW52YWxpZF92c2RfY291bnR5LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gSW52YWxpZCBWb3RlIFNoYXJlcyB2cyBEUFAtS01UIFNoYXJlIERpZmZlcmVuY2VzIGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eSwgYWVzKHg9SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1TaGFyZV9EaWZmLCBsYWJlbD1Db3VudHkpKSArCiAgZ2VvbV9wb2ludChzaGFwZT00LCBzaXplPTQsIHN0cm9rZT0yKSArCiAgbGFicyh4PSLlu6LnpajnjociLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrlu6LnpajnjofvvLjntqDol43lvpfnpajnjoflt64iKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGNvbG9yPSJncmV5NDAiKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgAoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfaW52YWxpZF92b3Rlc19yZWdpb24sIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgaW52YWxpZCB2b3RlcyBieSByZWdpb24uCnBfcmVnaW9uIDwtIHBfcmVnaW9uWywgSW52YWxpZF9Wb3Rlc19TaGFyZTo9Z2V0KCLnhKHmlYjnpajmlbhCIikgLyBnZXQoIuaKleelqOaVuEMgQz1BK0IiKV0KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUDo9SW52YWxpZF9Wb3Rlc19TaGFyZSAqIDEwMF0KYGBgCgpgYGB7ciBwcmVzaWRlbnRpYWxfaW52YWxpZF92c2RfcmVnaW9uLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIHZzIERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZXMgYnkgUmVnaW9uIn0KcCA8LSBnZ3Bsb3QocF9yZWdpb24sIGFlcyh4PUludmFsaWRfVm90ZXNfU2hhcmUsIHk9U2hhcmVfRGlmZiwgbGFiZWw9cGFzdGUoQnksIFJlZ2lvbikpKSArCiAgZ2VvbV9wb2ludChzaGFwZT00LCBzaXplPTQpICsKICBsYWJzKHg9IuW7ouelqOeOhyIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOmEiemOruW4guWNgO+8muW7ouelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIpICsKICAgICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKQpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKQSBzaW1wbGUgbGluZWFyIG1vZGVsIG9uIGludmFsaWQgdm90ZSBzaGFyZXMgYWdhaW5zdCBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzIHN1Z2dlc3RzIHRoZSBjb3JyZWxhdGlvbiBpcyBhdCBsZWFzdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LgpCdXQgc3VjaCBjb3JyZWxhdGlvbiBtYXkgYmUgWypzcHVyaW91cypdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwdXJpb3VzX3JlbGF0aW9uc2hpcCkgc28gdGhlIGludGVycHJldGF0aW9uIHNoYWxsIGJlIGNhdXRpb3VzLgoKYGBge3IgbG1faW52YWxpZH0KbG1faW52YWxpZCA8LSBsbShTaGFyZV9EaWZmIH4gSW52YWxpZF9Wb3Rlc19TaGFyZVAsIGRhdGE9cF9yZWdpb24pCmNvZWZ0ZXN0KGxtX2ludmFsaWQsIHZjb3Y9dmNvdkhDKGxtX2ludmFsaWQsIHR5cGU9IkhDMCIpKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMg5oqV56Wo546HIFZvdGVyIFR1cm5vdXQgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpbVm90ZXIgdHVybm91dF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVm90ZXJfdHVybm91dCkgaXMgZGVmaW5lZCBhcyB0b3RhbCB2b3RlcyBjYXN0ICh2YWxpZCBhbmQgaW52YWxpZCkgZGl2aWRlZCBieSBsZWdpdGltYXRlIHZvdGVycy4KVGhlIGluZm9ybWF0aW9uIGlzIHJlYWRpbHkgYXZhaWxhYmxlIGluIHRoZSBzb3VyY2UgZGF0YSBmcm9tIHRoZSBjb2x1bW4gYOaKleelqOeOh0ggSD1Dw7dHYC4KSW4gdGhpcyBzZWN0aW9uIHdlIGV4cGxvcmUgdGhlIHBvc3NpYmxlIHJlbGF0aW9uIGJldHdlZW4gdHVybm91dCBhbmQgdm90ZSBjb3VudHMuCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0LCByZXN1bHRzPSJoaWRlIn0KIyBHZXQgdm90aW5nIHJhdGUgZnJvbSB3aWRlIGRhdGEgdG8gbG9uZy4KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sW3BfY291bnR5LCBUdXJub3V0Oj1pLlR1cm5vdXQsIG9uPS4oQ291bnR5KV0KYGBgCgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfYmFyLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5LCBhZXMoeD1yZW9yZGVyKENvdW50eSwgVHVybm91dCksIHk9VHVybm91dCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBmaWxsPSJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKFR1cm5vdXQsICIlIikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3mipXnpajnjofmjpLluo/vvIkiLCB5PSLmipXnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjociKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDAsIHRvb2x0aXA9TlVMTCkKYGBgCgpJdCBpcyB3aWRlbHkgc3VnZ2VzdGVkIHRoYXQgYW4gaW5jcmVhc2luZyB2b3RlciB0dXJub3V0IGR1ZSB0byB5b3VuZ2VyIGdlbmVyYXRpb24gdGhpcyB0aW1lIGNhbiBodWdlbHkgaW1wYWN0IHRoZSByZXN1bHRzLgpIZXJlIHdlIHBsb3QgdGhlIHR1cm5vdXQgYWdhaW5zdCBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzIGJ5IGNvdW50eToKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eSwgYWVzKHg9VHVybm91dCwgeT1TaGFyZV9EaWZmLCBsYWJlbD1Db3VudHkpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDM1LCA4MCkpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLCBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBnZW9tX3RleHQoY2hlY2tfb3ZlcmxhcD1UUlVFLCBjb2xvcj0iZ3JleTQwIikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546H77y46JeN57ag5b6X56Wo546H5beuIikKYGBgCgpXZSB6b29tLWluIGluIHRoZSBmb2xsb3dpbmcgcGxvdCBmb3IgdGhvc2Ugd2l0aCB0dXJub3V0ID4gNzAlOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0NzBfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCAoPjcwJSkgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5W1R1cm5vdXQgPiA3MF0sIGFlcyh4PVR1cm5vdXQsIHk9U2hhcmVfRGlmZiwgbGFiZWw9Q291bnR5KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9Yyg3MCwgODApKSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9jb3VudHlbVHVybm91dCA+IDcwXVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLCBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVtUdXJub3V0ID4gNzBdWzFdLAogICAgICAgICAgICBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLCBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3RleHRfcmVwZWwoY29sb3I9ImdyZXk0MCIpICsKICBsYWJzKHg9IuaKleelqOeOh++8hSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOhyg+NzAlKe+8uOe2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKV2UgY2FuIGFsc28gdmlzdWFsaXplIHRoZSB0dXJub3V0IHJlbGF0aW9uIG9uIGVhY2ggcGFydHkgY2FuZGlkYXRlIGluc3RlYWQ6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfdnMsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IHZzIENhbmRpZGF0ZSBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpnZ3Bsb3QocF9jb3VudHlfbCwgYWVzKHg9VHVybm91dCwgeT1Wb3Rlc19TaGFyZSkpICsKICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocF9jb3VudHlfbCwgYnk9IkNhbmRpZGF0ZSIpLCBhZXMoZmlsbD1DYW5kaWRhdGUpLAogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKSArCiAgZmFjZXRfZ3JpZCh+IENhbmRpZGF0ZSkgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546H77y45b6X56Wo546HIikKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBDb3VudHkgU3ViLVJlZ2lvbiDkvp3phInpjq7luILljYAKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX3JlZ2lvbl90dXJub3V0fQojIENvbXB1dGUgcmVnaW9uLWxldmVsIHZvdGluZyByYXRlIGFuZCB2b3RlIHNoYXJlcyBpbiB0aGUgbG9uZyBkYXRhLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbcF9yZWdpb24sIFR1cm5vdXQ6PWkuVHVybm91dCwgb249LihSZWdpb24pXQpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKFJlZ2lvbildCmBgYAoKRnJvbSB0aGUgcHJldmlvdXMgY291bnR5LWxldmVsIHZpc3VhbGl6YXRpb24gd2UgcmVhbGl6ZWQgdGhhdCB0dXJub3V0IG1heSBiZSByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRERQIGFuZCBLTVQgY2FuZGlkYXRlcy4KSGVyZSB3ZSB1c2UgYSBzaW1wbGUgbGluZWFyIG1vZGVsIHRvIHRlc3QgdGhlIGNvcnJlbGF0aW9uIGJhc2VkIG9uIHJlZ2lvbi1sZXZlbCBkYXRhOgoKYGBge3IgbG1fdHVybm91dF92c2R9CmxtX3R1cm5vdXQgPC0gbG0oU2hhcmVfRGlmZiB+IFR1cm5vdXQsIGRhdGE9cF9yZWdpb25fbCkKY29lZnRlc3QobG1fdHVybm91dCwgdmNvdj12Y292SEMobG1fdHVybm91dCwgdHlwZT0iSEMwIikpCmBgYAoKQXBwYXJlbnRseSB0aGUgY29ycmVsYXRpb24gaXMgc2lnbmlmaWNhbnQuCkxldCdzIGFsc28gZ2VuZXJhdGUgdGhlIHJlZ2lvbi1sZXZlbCBzY2F0dGVycGxvdDoKCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbiwgYWVzKHg9VHVybm91dCwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiksCiAgICAgICAgICAgIGZpbGw9ImxpZ2h0Z3JlZW4iLCBhbHBoYT0uOCkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLAogICAgICAgICAgICBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5oqV56Wo546H77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpBZ2FpbiB3aXRoIGFkZGl0aW9uYWwgem9vbS1pbjoKCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dDcwX3ZzZCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgKD43MCUpIGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbltUdXJub3V0ID4gNzBdLCBhZXMoeD1UdXJub3V0LCB5PVNoYXJlX0RpZmYsIGxhYmVsPVJlZ2lvbikpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwKICAgICAgICAgICAgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFKSArCiAgZ2VvbV90ZXh0KGNoZWNrX292ZXJsYXA9VFJVRSwgbnVkZ2VfeT0tLjAzNSwgY29sb3I9ImRhcmtncmV5IikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5oqV56Wo546HKD43MCUp77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpXZSBjYW4gYWxzbyB0ZXN0IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHR1cm5vdXQgYW5kIHZvdGUgc2hhcmUgb2YgZWFjaCBwYXJ0eSdzIGNhbmRpZGF0ZXM6CgpgYGB7ciBsbV92cl92c30KZm9yICggY2FuZGlkYXRlIGluIHVuaXF1ZShwX3JlZ2lvbl9sJENhbmRpZGF0ZSkgKSB7CiAgbG1fdHVybm91dF9jYW5kaWRpYXRlIDwtIGxtKFZvdGVzX1NoYXJlIH4gVHVybm91dCwgZGF0YT1wX3JlZ2lvbl9sW0NhbmRpZGF0ZSA9PSBjYW5kaWRhdGVdKQogIG1lc3NhZ2UocmVwKCItIiwgODApKQogIG1lc3NhZ2UoIlRlc3QgY29ycmVsYXRpb24gYmV0d2VlbiB2b3RlIHNoYXJlcyBhbmQgdm90ZXIgdHVybm91dC4iKQogIG1lc3NhZ2Uoc3ByaW50ZigiRm9yICVzOiIsIGNhbmRpZGF0ZSkpCiAgcHJpbnQoY29lZnRlc3QobG1fdHVybm91dF9jYW5kaWRpYXRlLCB2Y292PXZjb3ZIQyhsbV90dXJub3V0X2NhbmRpZGlhdGUsIHR5cGU9IkhDMCIpKSkKfQpgYGAKCkludGVyZXN0aW5nbHksCnN1Y2ggY29ycmVsYXRpb24gaXMgbm90IGZvdW5kIGZvciBQRlAgY2FuZGlkYXRlcy4KCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdnJfdnMsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IHZzIENhbmRpZGF0ZSBWb3RlIFNoYXJlcyBieSBSZWdpb24ifQpnZ3Bsb3QocF9yZWdpb25fbCwgYWVzKHg9VHVybm91dCwgeT1Wb3Rlc19TaGFyZSkpICsKICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocF9yZWdpb25fbCwgYnk9IkNhbmRpZGF0ZSIpLCBhZXMoZmlsbD1DYW5kaWRhdGUpLAogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKSArCiAgZmFjZXRfZ3JpZCh+IENhbmRpZGF0ZSkgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546HIFgg5b6X56Wo546HIikKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBQb2xsaW5nIFBsYWNlIOS+neaKlemWi+elqOaJgAoKVEJDLgoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIOesrOWNgeWxhueri+azleWnlOWToemBuOiIiee1kOaenCBUaGUgMTB0aCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBSZXN1bHRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIOS4jeWIhuWNgOeri+WnlCBQYXJ0eSBMaXN0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X3Jlc3VsdHMsIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgcGFydHktbGlzdCByZXN1bHRzLgojIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgZG93biB0byBwb2xsaW5nIHBsYWNlIGxldmVsLgpwYXJ0eWxpc3QgPC0gZnJlYWQoImRhdGEvcHJvY2Vzc2VkL2xlZ2lzbGF0aXZlL2xlZ2lzbGF0aXZlX3BhcnR5bGlzdC5jc3YiLCBlbmNvZGluZz0iVVRGLTgiKQpwYXJ0eWxpc3QgPC0gcGFydHlsaXN0WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCmNvbHNfYXJlYSA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCmNvbHNfcGFydHkgPC0gbmFtZXMocGFydHlsaXN0KVs3OjI1XSAgIyBUaGVyZSBhcmUgMTkgcGFydGllcyBpbiB0b3RhbC4KcGFydHlsaXN0X2wgPC0gbWVsdChwYXJ0eWxpc3RbLCBjKGNvbHNfYXJlYSwgY29sc19wYXJ0eSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jb2xzX2FyZWEsIHZhcmlhYmxlLm5hbWU9IlBhcnR5IiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwYXJ0eWxpc3RfbCA8LSBwYXJ0eWxpc3RfbFssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXQpwYXJ0eWxpc3RfZmluYWwgPC0gcGFydHlsaXN0X2xbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKFBhcnR5KV0KcGFydHlsaXN0X2ZpbmFsIDwtIHBhcnR5bGlzdF9maW5hbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKRm9yIHBhcnR5IGxpc3QgdG8gc2VjdXJlIGF0IGxlYXN0IG9uZSBzZWF0IGluIFtMZWdpc2xhdGl2ZSBZdWFuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZWdpc2xhdGl2ZV9ZdWFuKSwKaXQgbXVzdCBvYnRhaW4gbWluaW1hbGx5IDUlIG9mIHBhcnR5LWxpc3Qgdm90ZXMuCklmIGEgcGFydHkgY2Fubm90IHBhc3MgdGhlIDUlIHRocmVzaG9sZCBidXQgcGFzcyB0aGUgMyUgdGhyZXNob2xkLAppdCB3aWxsIGJlIHNwb25zb3JlZCBieSB0aGUgZ292ZXJubWVudCBpbiB0aGUgZm9sbG93aW5nIDQgeWVhcnMgKGJhc2VkIG9uIG51bWJlciBvZiB2b3RlcyBvYnRhaW5lZCkuClRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3Igc21hbGwgcGFydGllcyB0byBjb3ZlciB0aGVpciBvcGVyYXRpbmcgY29zdHMuCgpgYGB7ciBwYXJ0eWxpc3RfZmluYWxfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IEZpbmFsIE91dGNvbWUifQp0aHJlc18wMDMgPC0gc3VtKHBhcnR5bGlzdF9maW5hbCRWb3RlcykgKiAuMDMKdGhyZXNfMDA1IDwtIHN1bShwYXJ0eWxpc3RfZmluYWwkVm90ZXMpICogLjA1CgpnZ3Bsb3QocGFydHlsaXN0X2ZpbmFsLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TpgbjoiInntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PVBhcnR5LCB5PVZvdGVzLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXMgKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUsIC4wMSkpKSwKICAgICAgICAgICAgc2l6ZT0zLCBoanVzdD0tLjA1KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgocGFydHlsaXN0X2ZpbmFsJFZvdGVzKSAqIDEuMjUpKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD10aHJlc18wMDMsIGNvbG9yPSLoo5zliqkgU3BvbnNvcnNoaXAiKSwgbGluZXR5cGU9MykgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9dGhyZXNfMDA1LCBjb2xvcj0i5bit5qyhIFNlYXRzIiksIGxpbmV0eXBlPTMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWU9IumWgOaquyBUaHJlc2hvbGQiLCB2YWx1ZXM9YygicmVkIiwgImdyZWVuIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCldlIGdyb3VwIHBhcnRpZXMgd2l0aCBsZXNzIHRoYW4gMiUgdm90ZXMgaW50byAib3RoZXJzIiB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBwbG90cyBlYXNpZXIgdG8gcmVhZC4KCmBgYHtyIHByb2Nlc3NfcGFydHlfbGlzdF9jb3VudHksIHJlc3VsdHM9ImhpZGUifQpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXQpzbWFsbF9wYXJ0aWVzIDwtIHBhcnR5bGlzdF9maW5hbFtTaGFyZSA8IC4wMiwgUGFydHldCgpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9jb3VudHlbUGFydHkgJWluJSBzbWFsbF9wYXJ0aWVzLCBQYXJ0eTo9IuWFtuS7liJdCnBhcnR5bGlzdF9jb3VudHkgPC0gcGFydHlsaXN0X2NvdW50eVssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXSAgIyBSZW5ldyBsZXZlbC4KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXSAgIyBSZS1ncm91cC4KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihCeSldCgojIENvbXB1dGUgRFBQLUtNVCBzaGFyZSBkaWZmZXJlbmNlcy4KcGFydHlsaXN0X2NvdW50eV9nYiA8LSBwYXJ0eWxpc3RfY291bnR5W1BhcnR5ICVpbiUgYygiKDE0KSAg5rCR5Li76YCy5q2l6buoIiwgIig5KSAg5Lit5ZyL5ZyL5rCR6buoIildCnNldG9yZGVyKHBhcnR5bGlzdF9jb3VudHlfZ2IsIEJ5LCBQYXJ0eSkKcGFydHlsaXN0X2NvdW50eV9nYl9kaWZmIDwtIHBhcnR5bGlzdF9jb3VudHlfZ2JbLCAuKFNoYXJlX0RpZmY9U2hhcmVbMl0gLSBTaGFyZVsxXSksIGJ5PS4oQnkpXQpwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYgPC0gcGFydHlsaXN0X2NvdW50eV9nYl9kaWZmWywgZHBwX3dpbjo9U2hhcmVfRGlmZiA+IDBdCmBgYAoKYGBge3IgcGFydHlfbGlzdF9jb3VudHksIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgVm90ZSBTaGFyZXMgYnkgQ291bnR5In0KcGFydHlfY29sb3JzIDwtIGMoImRhcmtvcmFuZ2UiLCAiZGFya2dyZWVuIiwgInllbGxvdyIsICJkb2RnZXJibHVlIiwgImdyZWVuIiwgImdyZWVuMyIsICJsaWdodGJsdWUiLCAiZ3JleSIpCmdncGxvdChwYXJ0eWxpc3RfY291bnR5LCBhZXMoeD1yZW9yZGVyKEJ5LCBWb3RlcyksIHk9U2hhcmUsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siLCB3aWR0aD0uOCkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIsIGFuZ2xlPTIwKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5pS/6buoIiwgdmFsdWVzPXBhcnR5X2NvbG9ycykgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC5pS/6buo5b6X56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpgYGAKCmBgYHtyIHBhcnR5X2xpc3RfZHBwX2ttdF9kaWZmLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgRFBQLUtNVCBTaGFyZSBEaWZmZXJlbmNlIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBhcnR5bGlzdF9jb3VudHlfZ2JfZGlmZiwgYWVzKHg9cmVvcmRlcihCeSwgU2hhcmVfRGlmZiksIGZpbGw9ZHBwX3dpbiwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lvpfnpajnjoflt67mjpLluo/vvIkiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgQ291bnR5IFN1Yi1SZWdpb24g5L6d6YSJ6Y6u5biC5Y2ACgpgYGB7ciBwcm9jZXNzX3BhcnR5X2xpc3RfcmVnaW9uLCByZXN1bHRzPSJoaWRlIn0KIyBQcm9jZXNzIHJlZ2lvbi1sZXZlbCBwYXJ0eSBsaXN0IHJlc3VsdHMuCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X2xbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKEJ5LCBSZWdpb24sIFBhcnR5KV0KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWywgUGFydHk6PWZhY3RvcihQYXJ0eSldICAjIFJlbmV3IGxldmVsLgpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9yZWdpb25bLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKEJ5LCBSZWdpb24pXQpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9yZWdpb25bIVBhcnR5ICVpbiUgc21hbGxfcGFydGllc10gICMgSWdub3JlIHNtYWxsIHBhcnRpZXMuCgojIEdldCBwcmVzaWRlbnRpYWwgaW52YWxpZCB2b3RlIHNoYXJlIGFuZCB0dXJub3V0LgpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9yZWdpb25bcF9yZWdpb24sIGA6PWAoCiAgUF9JbnZhbGlkX1ZvdGVzX1NoYXJlPWkuSW52YWxpZF9Wb3Rlc19TaGFyZSwKICBQX1R1cm5vdXQ9aS5UdXJub3V0CiAgKSwgb249LihCeSwgUmVnaW9uKV0KCiMgR2V0IHByZXNpZGVudGlhbCB2b3RlIHJlc3VsdHMuCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFssIFBfU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihCeSwgUmVnaW9uKV0KcGFydHlsaXN0X3JlZ2lvbiA8LSBtZXJnZShwYXJ0eWxpc3RfcmVnaW9uLCBwX3JlZ2lvbl9sWywgLihCeSwgUmVnaW9uLCBDYW5kaWRhdGUsIFBfU2hhcmUsIFNoYXJlX0RpZmYpXSwgYnk9YygiQnkiLCAiUmVnaW9uIiksIGFsbG93LmNhcnRlc2lhbj1UUlVFKQoKIyBIZWxwZXIgZnVuY3Rpb24gZm9yIHNjYXR0ZXIgcGxvdC4Kc2NhdHRlcnBsb3QgPC0gZnVuY3Rpb24oKSB7CiAgZ2dwbG90KHBhcnR5bGlzdF9yZWdpb24sIGFlcyh4PVNoYXJlLCB5PVBfU2hhcmUsIGNvbG9yPUNhbmRpZGF0ZSkpICsKICAgIGdlb21fcmVjdChkYXRhPXVuaXF1ZShwYXJ0eWxpc3RfcmVnaW9uLCBieT1jKCJQYXJ0eSIsICJDYW5kaWRhdGUiKSksIGFlcyhmaWxsPVBhcnR5KSwKICAgICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mLCBhbHBoYT0uMjUpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYXJ0eV9jb2xvcnMpICsKICAgIGdlb21fcG9pbnQoc2l6ZT0uNSkgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGFlcyhjb2xvcj1DYW5kaWRhdGUpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgICBsYWJzKHg9Iue4vee1seWAmemBuOS6uuW+l+elqOeOhyIsIHk9IuS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIsCiAgICAgICAgIHRpdGxlPSIyMDIw57i957Wx5YCZ6YG45Lq65b6X56Wo546H77y45LiN5YiG5Y2A5pS/6buo5b6X56Wo546HIikgKwogICAgZmFjZXRfd3JhcChQYXJ0eSB+IENhbmRpZGF0ZSwgbmNvbD0zLCBzY2FsZXM9ImZyZWUiKQp9CmBgYAoKV2UgY2FuIHBsb3QgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gcHJlc2lkZW50aWFsIGNhbmRpZGF0ZSB2b3RlIHNoYXJlcyBhbmQgcGFydHkgdm90ZSBzaGFyZXMgYXQgcmVnaW9uIGxldmVsLgpCdXQgd2UgbXVzdCBiZSB2ZXJ5IGNhcmVmdWwgaW4gaW50ZXJwcmV0aW5nIHRoZSByZWxhdGlvbiBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBkaXJlY3Rpb24gb2Ygc3VjaCByZWxhdGlvbiwgaWYgYW55LgpTdHJpY3RseSBzcGVha2luZywKd2UgZG9uJ3QgZXZlbiBrbm93IHdoZXRoZXIgdGhleSBhcmUgY2F1c2FsbHkgcmVsYXRlZCBhdCBhbGwuCgpgYGB7ciwgZmlnLmhlaWdodD0xNSwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gUGFydHkgTGlzdCBTaGFyZXMgdi5zLiBQcmVzaWRlbnRpYWwgVm90ZXMifQpzY2F0dGVycGxvdCgpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgUG9sbGluZyBQbGFjZSDkvp3mipXplovnpajmiYAKClRCQy4KCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMg5YiG5Y2A56uL5aeUIENvbnN0aXR1ZW5jeSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyMgT3ZlcmFsbCDmpoLmi6wKCmBgYHtyIHByb2Nlc3NfY29uc3RpdHVlbmN5LCByZXN1bHRzPSJoaWRlIn0KIyBQcm9jZXNzIGNvbnN0aXR5ZW5jeSByZXN1bHRzLgojIE5vdGUgdGhhdCBlYWNoIGRpc3RyaWN0IGNhbiBoYXZlIGEgdmFyeWluZyBudW1iZXIgb2YgY2FuZGlkYXRlcy4KaW5maWxlc19jb25zdGl0dWVuY3kgPC0gZ3JlcCgKICAiY29uc3RpdHVlbmN5IixkaXIoImRhdGEvcHJvY2Vzc2VkL2xlZ2lzbGF0aXZlLyIsIGZ1bGwubmFtZXM9VFJVRSksIHZhbHVlPVRSVUUpCgpjX2FsbCA8LSBsYXBwbHkoaW5maWxlc19jb25zdGl0dWVuY3ksIGZyZWFkLCBlbmNvZGluZz0iVVRGLTgiKQpuYW1lcyhjX2FsbCkgPC0gZ3N1YigibGVnaXNsYXRpdmVfY29uc3RpdHVlbmN5XyIsICIiLAogICAgICAgICAgICAgICAgICAgICB0b29sczo6ZmlsZV9wYXRoX3NhbnNfZXh0KGJhc2VuYW1lKGluZmlsZXNfY29uc3RpdHVlbmN5KSkpCgojIENvbnZlcnQgYWxsIHRhYmxlIGZyb20gd2lkZSB0byBsb25nLgp3aWRlX3RvX2xvbmcgPC0gZnVuY3Rpb24oRFQpIHsKICBjYW5kaWRhdGVfc3RhcnRfaW5kIDwtIDcKICBjYW5kaWRhdGVfZW5kX2luZCA8LSBuY29sKERUKSAtIDgKICBjb2xzX2NhbmRpZGF0ZSA8LSBuYW1lcyhEVClbY2FuZGlkYXRlX3N0YXJ0X2luZDpjYW5kaWRhdGVfZW5kX2luZF0KICBjb2xzX3JlZ2lvbiA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCiAgb3V0IDwtIG1lbHQoRFRbLCBjKGNvbHNfcmVnaW9uLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgIGlkLnZhcnM9Y29sc19yZWdpb24sIHZhcmlhYmxlLm5hbWU9IkNhbmRpZGF0ZSIsIHZhbHVlLm5hbWU9IlZvdGVzIikKICBvdXQKfQoKY19sIDwtIHJiaW5kbGlzdChsYXBwbHkoY19hbGwsIHdpZGVfdG9fbG9uZykpCmNfbCA8LSBjX2xbLCBSZWdpb246PXRyaW13cyhSZWdpb24sIHdoaXRlc3BhY2U9IltcXGhcXHZdIildICAjIFRyaW0gZnVsbC13aWR0aCB3aGl0ZQoKIyBFeHRyYWN0IGNhbmRpZGF0ZSBwYXJ0eSBmb3IgYWxsIGRpc3RyaWN0cy4KY19sIDwtIGNfbFssIFBhcnR5Oj1nc3ViKCIuKlsgXSIsICIiLCBDYW5kaWRhdGUpXQoKIyBTdW0gYnkgcGFydHkuCmNfcGFydHkgPC0gY19sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihQYXJ0eSldCmNfcGFydHkgPC0gY19wYXJ0eVssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKQ2hlY2sgbnVtYmVyIG9mIHBvbGxpbmcgcGxhY2VzIGZvciBlYWNoIGRpc3RyaWN0OgoKYGBge3IgbnVtYmVyX29mX3BwbGFjZV9ieV9kaXN0cmljdH0KY19wcGxhY2VfY250IDwtIGNfbFssIC5OLCBieT0uKEJ5KV0Kc2V0b3JkZXIoY19wcGxhY2VfY250LCBCeSkKc2V0bmFtZXMoY19wcGxhY2VfY250LCBjKCJEaXN0cmljdCIsICJOdW0gb2YgUG9sbGluZyBQbGFjZSIpKQpjX3BwbGFjZV9jbnRbXQpgYGAKCmBgYHtyIGNvbnN0aXR1ZW5jeV9wYXJ0eV9yZXN1bHQsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OC4zMywgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBDb25zdGl0dWVuY3kgT3V0Y29tZSBieSBQYXJ0eSJ9CmdncGxvdChjX3BhcnR5LCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPliIbljYDnq4vlp5TpgbjoiInntZDmnpw65L6d5YCZ6YG45Lq65pS/6buoIikgKwogIGdlb21fdGV4dChhZXMoeD1QYXJ0eSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzICglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSksCiAgICAgICAgICAgIHNpemU9MywgaGp1c3Q9LS4wNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpjb21tYSwgbGltaXRzPWMoMCwgbWF4KGNfcGFydHkkVm90ZXMpICogMS4yKSkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCmBgYHtyIHByb2Nlc3NfY29uc3RpdHVlbmN5X2J5X3BhcnR5X2J5X2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgS2VlcCBvbmx5IHRoZSB0b3AgZmV3IHBhcnRpZXMuCmNfdG9wX3BhcnR5IDwtIGNfcGFydHlbU2hhcmUgPiAuMDEsIFBhcnR5XQpjX3BhcnR5X2NvbG9ycyA8LSBjKCJkb2RnZXJibHVlIiwgImdyZWVuMyIsICJibGFjayIsICJ5ZWxsb3ciLCAibGlnaHRibHVlIiwgImRhcmtncmVlbiIsICJkYXJrZ3JleSIpCgojIFN1bSBieSBwYXJ0eSBieSBjb3VudHkuCmNfbCA8LSBjX2xbLCBDb3VudHk6PWdzdWIoIijnrKxbMC05XSspP+mBuOiIieWNgCIsICIiLCBCeSldCmNfcGFydHlfY291bnR5IDwtIGNvcHkoY19sKQpjX3BhcnR5X2NvdW50eSA8LSBjX3BhcnR5X2NvdW50eVshUGFydHkgJWluJSBjX3RvcF9wYXJ0eSwgUGFydHk6PSLlhbbku5YiXQpjX3BhcnR5X2NvdW50eSA8LSBjX3BhcnR5X2NvdW50eVssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQ291bnR5LCBQYXJ0eSldCmNfcGFydHlfY291bnR5IDwtIGNfcGFydHlfY291bnR5WywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihDb3VudHkpXQpjX3BhcnR5X2NvdW50eVssIFBhcnR5Oj1mYWN0b3IoUGFydHksIGxldmVsPWMoY190b3BfcGFydHksICLlhbbku5YiKSldCgojIE9yZGVyIGNvdW50eSBieSB0b3RhbCB2b3Rlcy4KY291bnR5X3ZfY250IDwtIGNfbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQ291bnR5KV0Kc2V0b3JkZXIoY291bnR5X3ZfY250LCAtVm90ZXMpCmNfcGFydHlfY291bnR5IDwtIGNfcGFydHlfY291bnR5WywgQ291bnR5Oj1mYWN0b3IoQ291bnR5LCBjb3VudHlfdl9jbnQkQ291bnR5KV0KCiMgQ29tcHV0ZSBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzLgpjX3BhcnR5X2NvdW50eV9nYiA8LSBjX3BhcnR5X2NvdW50eVtQYXJ0eSAlaW4lIGMoIuawkeS4u+mAsuatpem7qCIsICLkuK3lnIvlnIvmsJHpu6giKV0Kc2V0b3JkZXIoY19wYXJ0eV9jb3VudHlfZ2IsIENvdW50eSwgUGFydHkpCiMgTm90ZSB0aGF0IERQUCBoYXMgbm8gY2FuZGlkYXRlIGZvciAxIGNvdW50eS4gV2UgY291bnQgdGhlIHNoYXJlIGFzIDAuCmNfcGFydHlfY291bnR5X2diX2RpZmYgPC0gY19wYXJ0eV9jb3VudHlfZ2JbCiAgLCAuKFNoYXJlX0RpZmY9aWZlbHNlKGlzLm5hKFNoYXJlWzJdKSwgMCwgU2hhcmVbMl0pIC0gU2hhcmVbMV0pLCBieT0uKENvdW50eSldCmNfcGFydHlfY291bnR5X2diX2RpZmYgPC0gY19wYXJ0eV9jb3VudHlfZ2JfZGlmZlssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQpgYGAKCldlIHBsb3QgYWxsIHBhcnRpZXMgd2l0aCBtb3JlIHRoYW4gMSUgdm90ZSBzaGFyZSBieSBjb3VudHk6CgpgYGB7ciBjb25zdGl0dWVuY3lfcGFydHlfY291bnR5LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTguMzMsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gQ29uc3RpdHVlbmN5IFNoYXJlcyBieSBQYXJ0eSBieSBDb3VudHkifQpnZ3Bsb3QoY19wYXJ0eV9jb3VudHksIGFlcyh4PXJlb3JkZXIoUGFydHksIFZvdGVzKSwgeT1TaGFyZSwgZmlsbD1QYXJ0eSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIsIHdpZHRoPS43NSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwKICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCBzaXplPTMsIGhqdXN0PS0uMSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxKSwgYnJlYWtzPXNlcSgwLCAxLCAuMikpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLmlL/pu6giLCB2YWx1ZXM9Y19wYXJ0eV9jb2xvcnMpICsKICBsYWJzKHg9IuaUv+m7qCIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+WIhuWNgOeri+WnlOWQhOe4o+W4guaUv+m7qOW+l+elqOeOhyIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBmYWNldF93cmFwKENvdW50eSB+IC4sIG5jb2w9NSkKYGBgCgpBbHNvIGV4YW1pbmUgdGhlIERQUC1LTVQgZGlmZmVyZW5jZSBmb3IgY29uc3RpdHVlbmN5IHZvdGVzIGJ5IGNvdW50eToKCmBgYHtyIGNvbnN0aXR1ZW5jeV9kcHBfa210X2RpZmYsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gQ29uc3RpdHVlbmN5IERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZSBieSBDb3VudHkifQpwIDwtIGdncGxvdChjX3BhcnR5X2NvdW50eV9nYl9kaWZmLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgU2hhcmVfRGlmZiksIGZpbGw9ZHBwX3dpbiwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lvpfnpajnjoflt67mjpLluo/vvIkiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPliIbljYDnq4vlp5TlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgVGFpY2h1bmcgM3JkIERpc3RyaWN0IOWPsOS4reW4guesrOS4iemBuOWNgAoKYGBge3IgcHJvY2Vzc190YWljaHVuZ18zLCByZXN1bHRzPSJoaWRlIn0KIyBDb25zb2xpZGF0ZSBib3RoIHBhcnR5LWxpc3QgYW5kIGNvbnN0aXR1ZW5jeSByZXN1bHRzIGZvciBUYWljaHVuZyBkaXN0cmljdCAzLgp0YzMgPC0gY19sW0J5ID09ICLoh7rkuK3luILnrKwz6YG46IiJ5Y2AIl0KdGMzIDwtIHRjM1ssIENfU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKV0KCiMgQ29tcHV0ZSBwYXJ0eS1saXN0IHZvdGUgc2hhcmVzIGJ5IHBvbGxpbmcgcGxhY2UuCnRjM19wbCA8LSBwYXJ0eWxpc3RfbFtCeSA9PSB0YzMkQ291bnR5WzFdICYgUmVnaW9uICVpbiUgdGMzJFJlZ2lvbl0KdGMzX3BsIDwtIHRjM19wbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oUGxhY2UpXQp0YzNfY2FuZGlkYXRlcyA8LSBjKCIoMykg5rSq5oWI5bq4IOeEoSIsICIoNCkg5by1552/5YCJIOWPsOeBo+awkeecvum7qCIsICIoNikg5qWK55OK55OUIOS4reWci+Wci+awkem7qCIpCnRjM19maW5hbCA8LSBtZXJnZSh0YzNfcGwsIHRjM1tDYW5kaWRhdGUgJWluJSB0YzNfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4oUGxhY2UsIENhbmRpZGF0ZSwgQ19TaGFyZSldLAogICAgICAgICAgICAgICAgICAgYnk9IlBsYWNlIiwgYWxsb3cuY2FydGVzaWFuPVRSVUUpCmBgYAoKYGBge3IgdGFpY2h1bmdfM19jYW5kaWRhdGVfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iVGFpY2h1bmcgM3JkIERpc3RyaWN0OiBDb25zdGl0dWVuY3kgQ2FuZGlkYXRlIFNoYXJlIn0KdGMzciA8LSB0YzNbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKENhbmRpZGF0ZSldCnRjM3IgPC0gdGMzclssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmdncGxvdCh0YzNyLCBhZXMoeD1yZW9yZGVyKENhbmRpZGF0ZSwgVm90ZXMpLCB5PVZvdGVzKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5YCZ6YG45Lq6IiwgeT0i5b6X56Wo5pW4IiwgdGl0bGU9IuiHuuS4reW4guesrDPpgbjoiInljYDntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PXJlb3JkZXIoQ2FuZGlkYXRlLCBWb3RlcyksIHk9Vm90ZXMsCiAgICAgICAgICAgICAgICBsYWJlbD1zcHJpbnRmKCIlc1xuKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUpKSksCiAgICAgICAgICAgIHNpemU9NSwgaGp1c3Q9LS4xKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgodGMzciRWb3RlcykgKiAxLjIpKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKYGBge3IsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSJUYWljaHVuZyAzcmQgRGlzdHJpY3Q6IFBhcnR5LUxpc3QgU2hhcmUifQp0YzNfcGxyIDwtIHRjM19wbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oUGFydHkpXQp0YzNfcGxyIDwtIHRjM19wbHJbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQp0YzNfcGxyIDwtIHRjM19wbHJbU2hhcmUgPiAuMDFdCnNldG9yZGVyKHRjM19wbHIsIC1Wb3RlcykKdGMzX3BsciA8LSB0YzNfcGxyWywgUGFydHk6PWZhY3RvcihQYXJ0eSldCmdncGxvdCh0YzNfcGxyLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRhcmtvcmFuZ2UiLCAiZGFya2dyZWVuIiwgInllbGxvdyIsICJkb2RnZXJibHVlIiwgImdyZWVuIiwgImdyZWVuMyIsICJsaWdodGJsdWUiKSkgKwogIGxhYnMoeD0i5pS/6buoIiwgeT0i5b6X56Wo5pW4IiwgdGl0bGU9IuiHuuS4reW4guesrDPpgbjoiInljYDkuI3liIbljYDmlL/pu6jntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PXJlb3JkZXIoUGFydHksIFZvdGVzKSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzXG4oJXMpIiwgc2NhbGVzOjpjb21tYShWb3RlcyksIHNjYWxlczo6cGVyY2VudChTaGFyZSkpKSwKICAgICAgICAgICAgc2l6ZT00LCBoanVzdD0tLjEpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEsIGxpbWl0cz1jKDAsIG1heCh0YzNfcGxyJFZvdGVzKSAqIDEuMikpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3IgdGFpY2h1bmdfM19wYXJ0eWxpc3RfeF9jYW5kaWRhdGUsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTMwLCBmaWcud2lkdGg9Ni41LCBmaWcuY2FwPSJUYWljaHVuZyAzcmQgRGlzdHJpY3Q6IFBhcnR5LUxpc3QgU2hhcmUgdnMgQ29uc3RpdHVlbmN5IENhbmRpZGF0ZSBTaGFyZSJ9CmdncGxvdCh0YzNfZmluYWwsIGFlcyh4PVNoYXJlLCB5PUNfU2hhcmUpKSArCiAgZ2VvbV9wb2ludChzaXplPS41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBsYWJzKHg9IuS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIsIHk9Iueri+WnlOWAmemBuOS6uuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0i6Ie65Lit5biC56ysM+mBuOiIieWNgOS4jeWIhuWNgOaUv+m7qOW+l+elqOeOh++8uOWAmemBuOS6uuW+l+elqOeOhyIpICsKICBmYWNldF93cmFwKFBhcnR5IH4gQ2FuZGlkYXRlLCBuY29sPTMsIHNjYWxlcz0iZnJlZSIpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMgUmVmZXJlbmNlcyBvbiBSIFBhY2thZ2VzCg==